package game

import (
	"time"
	"wanyu/server/engine/globaldef/consts"
	"wanyu/server/engine/logger"
	"wanyu/server/engine/wpcfg"

	"go.mongodb.org/mongo-driver/bson/primitive"
)

var l *logger.Logger

/**配置文件
{
    "logger" : {
        "game" : {
            "addrs" : [
                "192.168.0.193:9092"
            ],
            "partition":0,
            "maxBytes":0,
            "MaxMsgCnt":0
        }
    }
}*/
//初始化
func Init(typ string) {
	var c logger.Config
	wpcfg.ScanNode(consts.ConfigServer, &c, "logger", "game")
	lll := logger.NewLogger("game."+typ, &c)
	if lll == nil {
		panic("create game logger failed")
	}
	l = lll
}

//游戏日志记录器
type Game struct {
	roundID string
}

//创建一个游戏日志记录器
func NewGame() *Game {
	return &Game{}
}

type LogData struct {
	RoundID string      `json:"roundID"`
	Type    uint8       `json:"type"`
	Data    interface{} `json:"data"`
	Time    int64       `json:"time"`
}

//开始数据
type BeginData struct {
	//局号
	RoundID string `json:"-"`
	//房间号
	RoomID string `json:"roomID"`
	//子游戏编号
	Kind uint32 `json:"kind"`
	//底分
	BaseScore int64 `json:"baseScore"`
}

//开始游戏
func (g *Game) Begin(d *BeginData) {
	t := time.Now()
	g.roundID = primitive.NewObjectIDFromTimestamp(t).Hex()
	l.Log(&LogData{
		RoundID: g.roundID,
		Type:    's',
		Data:    d,
		Time:    t.Unix(),
	})
}

//EventData 事件数据
type EventData struct {
	SeatID        int32  `json:"seatID"`
	PlayerID      string `json:"playerID"`
	PlayerAccount string `json:"PlayerAccount"` //操作类型
	OptType       int32  `json:"optType"`
	//操作数据
	OptData interface{} `json:"optData"`
}

func (g *Game) Event(d *EventData) {
	l.Log(&LogData{
		RoundID: g.roundID,
		Type:    'e',
		Data:    d,
		Time:    time.Now().Unix(),
	})
}

//PlayerData 玩家数据
type PlayerData struct {
	SeatID        int32  `json:"seatID"`
	AgentID       string `json:"agentID"`
	PlayerID      string `json:"playerID"`
	PlayerAccount string `json:"PlayerAccount"`
	IsRobot       bool   `json:"isRobot"`
	//玩家的ip
	ClientIP string `json:"clientIP"`
	//机器人类型
	RobotType int32 `json:"robotType"`
	//初始数据
	BeginScore int64 `json:"beginScore"`
	//结束数据
	EndScore int64 `json:"endScore"`
	//输赢
	WinScore int64 `json:"winScore"`
	//投注
	Bet int64 `json:"bet"`
	//税收
	Tax int64 `json:"tax"`
	//流水
	ScoreFlow int64 `json:"scoreFlow"`
	//暗税
	InvisibleTax int64  `json:"invisibleTax"`
	//结果数据，如炸金花中牌的类型，斗牛中的牌型
	Result interface{} `json:"result"`
	//私有数据 所有的牌
	Data interface{} `json:"data"`
	// 受控类型，0为不受控（原则上永远不可能为0），1为受管控控制，2为受特控控制，3为受个人水位控制，4为受系统水位控制，本字段只对真实玩家有意义
	CtrlType int32 `json:"ctrlType"`
	// 杀放概率，[-1, 1]区间的浮点数，为负代表系统针对玩家放水的概率，为正代表系统针对玩家杀分的概率，0表示不杀不放，本字段只对真实玩家有意义
	KillRate float32 `json:"killRate"`
	// 是否真的受控，本字段只对真实玩家有意义
	IsCtrl bool `json:"isCtrl"`
}

//EndData 结束数据
type EndData struct {
	//公共的数据 如斗地主3张底牌 德州扑克的五张公共牌
	Data    interface{}   `json:"data"`
	Players []*PlayerData `json:"players"`
}

func (g *Game) End(d *EndData) {
	l.Log(&LogData{
		RoundID: g.roundID,
		Type:    'n',
		Data:    d,
		Time:    time.Now().Unix(),
	})
}
